package br.edu.ifrn.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.edu.ifrn.model.ClasseDocumento;
import br.edu.ifrn.model.Documento;
import br.edu.ifrn.model.Metavalor;
import br.edu.ifrn.model.TipoDocumento;
	
	public class DocumentoDAO extends AbstractDAO {
		public DocumentoDAO(EntityManager em) {
			AbstractDAO.em = em;
		}
		
		@Override
		public <E> List<E> listar() {
			Query q = em.createQuery("Select u From Documento u");
			return q.getResultList();
		}
		
		public List<Documento> buscar(String busca, String tipo, String classe) {
			Query q = em.createQuery("SELECT DISTINCT d FROM Documento AS d INNER JOIN d.metavalores m WHERE soundex(m.valor) = soundex(?1)");
			q.setParameter(1,busca);
			if(tipo=="Todos" && classe=="Todos"){
				System.out.println(tipo+" chamado "+classe);
				return  q.getResultList();
			} if(classe=="Todos"){
					List<Documento> documentos = q.getResultList();
					List<Documento> resultado = new ArrayList<Documento>();
					for(Documento d: documentos){
						for(Metavalor m: d.getMetavalores()){
							if(m.getValor().equalsIgnoreCase(busca) && tipo.equals(d.getTipo().getDescricao())){ 
								resultado.add(d);
							}
						}				
					}
					return resultado;
					}
			if(tipo=="Todos"){
				List<Documento> documentos = q.getResultList();
				List<Documento> resultado = new ArrayList<Documento>();
				for(Documento d: documentos){
					for(Metavalor m: d.getMetavalores()){
						if(m.getValor().equalsIgnoreCase(busca) && classe.equals(d.getClasse().getDescricao())){ 
							resultado.add(d);
						}
					}				
				}
				return resultado;
				}
			List<Documento> documentos = (List<Documento>)q.getResultList();
			List<Documento> resultado = new ArrayList<Documento>();
			for(Documento d: documentos){
				for(Metavalor m: d.getMetavalores()){
					if(m.getValor().equalsIgnoreCase(busca) && (tipo.equals(d.getTipo().getDescricao()) || classe.equals(d.getClasse().getDescricao()))){ 
						resultado.add(d);
					}
				}				
			}
			return resultado;
		}
		
		public Documento find(Long id) {
			return findById(Documento.class, id);
		}
	}

